home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / tutor / pro30 / chap12.txt < prev    next >
Text File  |  1991-02-04  |  29KB  |  649 lines

  1.  
  2.  
  3.  
  4.                                                        Chapter 12
  5.                                   POINTERS AND DYNAMIC ALLOCATION
  6.  
  7.  
  8. THIS IS ADVANCED MATERIAL
  9. _________________________________________________________________
  10.  
  11. For certain types of programs, pointers and dynamic allocation can
  12. be a tremendous advantage, but many programs do not need such a
  13. high degree of data structure.  For that reason, it would probably
  14. be to your advantage to lightly skim over these topics and come
  15. back to them later when you have a substantial base of Pascal
  16. programming experience.  It would be good to at least skim over
  17. this material rather than completely neglecting it, so you will
  18. have an idea of how pointers and dynamic allocation work and that
  19. they are available for your use when needed.
  20.  
  21. A complete understanding of this material will require deep
  22. concentration as it is complex and not at all intuitive. 
  23. Nevertheless, if you pay close attention, you will have a good
  24. grasp of pointers and dynamic allocation in a short time.
  25.  
  26.  
  27.  
  28. WHAT ARE POINTERS, AND WHAT GOOD ARE THEY?
  29. _________________________________________________________________
  30.  
  31. Examine the program named POINT.PAS for your      ===============
  32. first example of a program using pointers.  In       POINT.PAS
  33. the var declaration you will see two variables    ===============
  34. named Where and Who that have the symbol ^ in
  35. front of their types.  This defines them, not as
  36. variables, but as pointers to integer type variables and since they
  37. are pointers, they store the address of data rather than the data
  38. itself.  Note that three additional pointers are defined in line
  39. 9 which are also pointers defined with a pointer type.  The pointer
  40. type is defined earlier in line 4.  Either method of definition can
  41. be used and gives the same result.  Figure 12-1 is a graphical
  42. representation of the data space prior to beginning execution of
  43. the program.  A box represents a variable, and a box with a dot in
  44. it represents a pointer.  In line 12 of the program, the variable
  45. Index is assigned the value of 17 for purposes of illustration. 
  46. The pointer named Where is then assigned the address of the
  47. variable Index which means that it does not contain the value of
  48. 17, it contains the address of the storage location where the
  49. variable Index is stored.  In like manner, we assign the address
  50. of Index to the pointer named Who.  It should be obvious to you
  51. that Addr is a TURBO Pascal function that returns the address of
  52. its argument.
  53.  
  54.  
  55.  
  56.  
  57.  
  58.                                                         Page 12-1
  59.  
  60.                      Chapter 12 - Pointers and Dynamic Allocation
  61.  
  62. HOW DO WE USE THE POINTERS?
  63. _________________________________________________________________
  64.  
  65. It should be clear to you that we now have a single variable named
  66. Index with two pointers pointing at it as depicted in figure 12-2. 
  67. If the pointers are useful, we should be able to do something with
  68. them now, so we simply print out the same variable three different
  69. ways in line 15.  When we write "Where^", we are telling the system
  70. that we are not interested in the pointer itself, but instead we
  71. are interested in the data to which the pointer points.  This is
  72. referred to as dereferencing the pointer.  Careful study of the
  73. output fields in line 15 will reveal that we first display the
  74. value of Index, then the value to which the pointer Where points,
  75. and finally the value to which the pointer Who points.  Since both
  76. pointers point to the variable Index, we are essentially displaying
  77. the value of Index three times.  You will confirm this when you
  78. compile and run this program.
  79.  
  80. In line 17, we tell the system to assign the value of 23 to the
  81. variable to which the pointer Where points as an illustration, and
  82. figure 12-3 pictures the data space following this assignment.  If
  83. you understood the discussion in the previous paragraph, you will
  84. understand that we are actually assigning the variable named Index
  85. the value of 23 because that is where the pointer named Where is
  86. pointing.  In line 18, we once again display the value of the
  87. variable Index 3 times just as we did in line 15.  It would be to
  88. your advantage to compile and run this program to see that the
  89. value of 17 is output three times, then the value of 23 is output
  90. three times because in both cases, we are actually outputting the
  91. same value three times.
  92.  
  93. In a program as simple as this, the value of pointers is not at all
  94. clear, but a simple program is required in order to make the
  95. technique clear.  Display the program named POINT.PAS on your
  96. monitor again because we are not yet finished with it.
  97.  
  98.  
  99.  
  100. A FEW MORE POINTERS
  101. _________________________________________________________________
  102.  
  103. In line 4, we define a new type named Int_Point which is a pointer
  104. type to an integer variable.  We use this new type in line 9 to
  105. define three more pointers and in line 20, we assign one of them
  106. the address of the variable named Index.  Since the pointers are
  107. of identical types, we can assign Pt2 the value of Pt1, as
  108. illustrated in line 21.  This is actually the address of the
  109. variable named Index.  Likewise, the pointer Pt3 is assigned the
  110. value of Pt2, and we have all three pointers pointing to the
  111. variable named Index.  TURBO Pascal will allow you to assign
  112. pointers like this only if they are of the same type, which these
  113. three are.  However, since the pointers named Where and Who are
  114. declared individually, they are not of the same type according to
  115. the rules of Pascal and if line 14 were changed in such a way that
  116.  
  117.                                                         Page 12-2
  118.  
  119.                      Chapter 12 - Pointers and Dynamic Allocation
  120.  
  121. it read "Who := Where;", a compilation error would occur.  The
  122. variables are only assignment compatible if they are declared with
  123. the same type name.
  124.  
  125. Finally, we assign the only variable in this program which is named
  126. Index the value of 15 in line 23 and display the value 15 three
  127. times as we did above.  Compile and run this program again to see
  128. that it does indeed display the value 15 three times.  Of course,
  129. you could write out the value 15 six times by using the other two
  130. pointers and the variable name Index in addition to the three new
  131. pointers. 
  132.  
  133.  
  134. THIS IS FOR TURBO PASCAL ONLY
  135. _________________________________________________________________
  136.  
  137. Display the program named POINT2.PAS on your     ================
  138. monitor for an example of another new extension     POINT2.PAS
  139. to the Pascal programming language by Borland.   ================
  140. This program is identical to the last example
  141. program except in lines 13, 14 and 20, where the
  142. symbol @ is used to denote the address of the variable Index rather
  143. than the function Addr.  This was added to TURBO Pascal as a
  144. convenience for you.  In ANSI standard Pascal the @ symbol is used
  145. as a synonym for the ^ symbol but Borland chose to use it for a
  146. completely different purpose.  Use of this symbol will result in
  147. a program that will not compile properly with any Pascal compiler
  148. other than TURBO Pascal.
  149.  
  150.  
  151.  
  152. OUR FIRST LOOK AT DYNAMIC ALLOCATION
  153. _________________________________________________________________
  154.  
  155. If you examine the file named POINTERS.PAS, you  ================
  156. will see a very trivial example of pointers and    POINTERS.PAS
  157. how they are used with dynamically allocated     ================
  158. variables.  In the var declaration, you will see
  159. that the two variables have a ^ in front of
  160. their respective types once again, defining two pointers.  They
  161. will be used to point to dynamically allocated variables that have
  162. not yet been defined.
  163.  
  164. The pointer My_Name is a pointer to a 20 character string.  The
  165. pointer actually points to an address somewhere within the computer
  166. memory, but we don't know where yet.  Actually, there is nothing
  167. for it to point at because we have not defined a variable.  After
  168. we assign it something to point to, we can use the pointer to
  169. access the data stored at that address.
  170.  
  171. Your computer has some amount of memory installed in it. If it is
  172. an IBM-PC or compatible, it can have up to 640K of RAM which is
  173. addressable by various programs.  The operating system requires
  174. about 60K of the total, and the TURBO Pascal run time system
  175.  
  176.                                                         Page 12-3
  177.  
  178.                      Chapter 12 - Pointers and Dynamic Allocation
  179.  
  180. requires about 4K to 8K depending on which version you are using,
  181. and what functions you have called.  The TURBO Pascal program can
  182. use up to 64K.  Adding those three numbers together results in
  183. about 128K or 132K.  Any memory you have installed in excess of
  184. that is available for the stack and the heap.  The stack is a
  185. standard area defined and controlled by DOS that can grow and
  186. shrink as needed.  Many books are available to define the stack and
  187. its use if you are interested in more information on it.
  188.  
  189.  
  190.  
  191. WHAT IS THE HEAP?
  192. _________________________________________________________________
  193.  
  194. The heap is a Pascal defined entity that utilizes otherwise unused
  195. memory to store data.  It begins immediately following the program
  196. and grows as necessary upward toward the stack which is growing
  197. downward.  As long as they never meet, there is no problem.  If
  198. they meet, a run-time error is generated.  The heap is therefore
  199. outside of any memory limitation imposed by TURBO Pascal or any
  200. other Pascal compiler.
  201.  
  202. Newer versions of TURBO Pascal do not limit us to 64K for the
  203. entire program, but there are other reasons for using the heap in
  204. addition to any memory limitation.  These should be evident as we
  205. learn how the heap works.
  206.  
  207. If you did not understand the last few paragraphs, don't worry. 
  208. Simply remember that dynamically allocated variables are stored on
  209. the heap and do not count in the 64K limitation placed upon you by
  210. some compilers.
  211.  
  212.  
  213. Back to our example program, POINTERS.PAS.  When we actually begin
  214. executing the program, we still have not defined the variables we
  215. wish to use to store data in.  The first executable statement in
  216. line 10 generates a variable for us with no name and stores it on
  217. the heap.  Since it has no name, we cannot do anything with it,
  218. except for the fact that we do have a pointer My_Name that is
  219. pointing to it.  By using the pointer, we can store up to 20
  220. characters in it, because that is its type, and later go back and
  221. retrieve the 20 characters.
  222.  
  223.  
  224.  
  225. WHAT IS DYNAMIC ALLOCATION?
  226. _________________________________________________________________
  227.  
  228. The variable we have just described is a dynamically allocated
  229. variable because it was not defined in a var declaration, but with
  230. a New procedure.  The New procedure creates a variable of the type
  231. defined by the pointer, puts the variable on the heap, and finally
  232. assigns the address of the variable to the pointer itself.  Thus
  233. My_Name contains the address of the variable generated.  The
  234.  
  235.                                                         Page 12-4
  236.  
  237.                      Chapter 12 - Pointers and Dynamic Allocation
  238.  
  239. variable itself is referenced by using the pointer to it followed
  240. by a ^, just like in the last program, and is read, "the variable
  241. to which the pointer points".
  242.  
  243. The statement in line 11 assigns a place on the heap to an integer
  244. type variable and puts its address in My_Age.  The data space can
  245. now be pictured as in figure 12-5.  Note that we have the data
  246. locations defined but there is no data stored in the locations yet.
  247.  
  248. Following the New statements we have two assignment statements in
  249. which the two variables pointed at are assigned values compatible
  250. with their respective types, and they are both written out to the
  251. video display in much the same manner as we did in the program
  252. named POINT.PAS.
  253.  
  254. Following execution of lines 13 and 14, the data space is
  255. configured as illustrated in figure 12-6.  Lines 16 and 17
  256. illustrate that the dynamically allocated data can be used in the
  257. same manner as any data provided the "carat" is used with the
  258. variable name.
  259.  
  260.  
  261.  
  262. GETTING RID OF DYNAMICALLY ALLOCATED DATA
  263. _________________________________________________________________
  264.  
  265. The two statements in lines 19 and 20 are illustrations of the way
  266. the dynamically allocated variables are removed from use.  When
  267. they are no longer needed, they are disposed of with the Dispose
  268. procedure which frees up their space on the heap so it can be
  269. reused.
  270.  
  271. In such a simple program, pointers cannot be appreciated, but it
  272. is necessary for a simple illustration.  In a large, very active
  273. program, it is possible to define many variables, dispose of some
  274. of them, define more, and dispose of more, etc.  Each time some
  275. variables are disposed of, their space is then made available for
  276. additional variables defined with the New procedure.
  277.  
  278. The heap can be made up of any assortment of variables, they are
  279. not required to be of one type.  One point must be kept in mind
  280. however.  Anytime a variable is defined, it will have a pointer
  281. pointing to it.  The pointer is the only means by which the
  282. variable can be accessed.  If the pointer to the variable is lost
  283. or changed, the data itself is lost for all practical purposes. 
  284. This will be illustrated in a later example program in this
  285. chapter.
  286.  
  287. Compile and run this program and examine the output.  If you do not
  288. understand how this program works, review it carefully before going
  289. on to the next example program.
  290.  
  291.  
  292.  
  293.  
  294.                                                         Page 12-5
  295.  
  296.                      Chapter 12 - Pointers and Dynamic Allocation
  297.  
  298. DYNAMICALLY STORING RECORDS
  299. _________________________________________________________________
  300.  
  301. The next example program, DYNREC.PAS, is a       ================
  302. repeat of one we studied in an earlier chapter.     DYNREC.PAS
  303. For your own edification, review the example     ================
  304. program BIGREC.PAS before going ahead in this
  305. chapter.
  306.  
  307. Assuming that you are back in DYNREC.PAS, you will notice that this
  308. program looks very similar to the earlier one, and in fact they do
  309. exactly the same thing.  The only difference in the type
  310. declaration is the addition of a pointer Person_Id, and in the var
  311. declaration, the first four variables are defined as pointers here,
  312. and were defined as record variables in the last program.
  313.  
  314. A point should be made here.  Pointers are not generally used in
  315. very small programs.  This example program is a good bit larger
  316. than the last few programs, and should be a clue to you as to why
  317. such a trivial program was used to introduce pointers in this
  318. tutorial.  A very small, concise program can illustrate a topic
  319. much better that an large complex program, but we must go on to
  320. more useful constructs of any new topic.  This of course, requires
  321. more elaborate programs.
  322.  
  323.  
  324. WE JUST BROKE THE GREAT RULE OF PASCAL
  325. _________________________________________________________________
  326.  
  327. The observant student will notice that, in the type declaration we
  328. used the identifier Person in line 18 before we defined it in line
  329. 19, which is illegal in Pascal.  Foreseeing the need to define a
  330. pointer prior to the record, the designers of Pascal allow us to
  331. break the rule in this one place.  The pointer could have been
  332. defined after the record in this particular case, but it was more
  333. convenient to put it before, and in the next example program, it
  334. will be required to put it before the record.  We will get there
  335. soon.
  336.  
  337. Since Friend is an array of 50 pointers, we have now defined 53
  338. different pointers to records, but so far have defined no variables
  339. other than Temp and Index.  We immediately use the New procedure
  340. to dynamically allocate a record with Self pointing to it, and use
  341. the pointer so defined to fill the dynamically allocated record. 
  342. Compare this to the program named BIGREC.PAS and you will see that
  343. it is identical except for the addition of the New and adding the
  344. ^ to each use of the pointer to designate the data pointed to.
  345.  
  346.  
  347. THIS IS A TRICK, BE CAREFUL
  348. _________________________________________________________________
  349.  
  350. Now go down to line 48 where Mother is allocated a record and is,
  351. by definition, pointing to the record.  It seems an easy thing to
  352.  
  353.                                                         Page 12-6
  354.  
  355.                      Chapter 12 - Pointers and Dynamic Allocation
  356.  
  357. do then to simply assign all of the values of Self to all the
  358. values of Mother as shown in the next statement, but it doesn't
  359. work.  The only thing the statement does is make the pointer Mother
  360. point to the same place where Self is pointing because we did a
  361. pointer assignment.  The data that was allocated to the pointer
  362. Mother is now somewhere on the heap, but we don't know where, and
  363. we cannot find it, use it, or deallocate it since we have lost the
  364. reference to it.  This is an example of losing data on the heap.
  365.  
  366. The proper way to assign data from one record to another is given
  367. in lines 50 and 51 where all fields of Father are defined by all
  368. fields of Mother which is pointing at the original Self record. 
  369. Note that since Mother and Self are both pointing at the same
  370. record, if we changed the data with either pointer, the data
  371. appears to be changed in both because there is, in fact, only one
  372. record where this data is stored.
  373.  
  374. In order to Write from or Read into a dynamically assigned record
  375. it is necessary to use a temporary record since dynamically
  376. assigned records are not allowed to be used in I/O statements. 
  377. This is illustrated in lines 57 through 63 of the program where
  378. some data is written to the monitor.
  379.  
  380. Finally, the dynamically allocated variables are disposed of prior
  381. to ending the program.  For a simple program such as this, it is
  382. not necessary to dispose of them because all dynamic variables are
  383. disposed of automatically when the program is terminated and we
  384. return to DOS or the TURBO Pascal integrated environment.  Notice
  385. that if the "Dispose(Mother);" statement was included in the
  386. program, the data could not be found due to the lost pointer, and
  387. the program would be unpredictable, possibly even resulting in a
  388. system crash.
  389.  
  390. It would be a meaningful exercise for you to diagram the data space
  391. for this program at a few selected points in its execution.  This
  392. should be done in a manner similar to that done in figure 12-1 to
  393. figure 12-5 of this chapter.
  394.  
  395.  
  396. WHAT GOOD IS THIS ANYWAY?
  397. _________________________________________________________________
  398.  
  399. Remember when you were initially studying BIGREC.PAS?  I suggested
  400. that you see how big you could make the constant Number_Of_Friends
  401. before you ran out of memory.  At that time we found that it could
  402. be made slightly greater than 1000 before we got the memory
  403. overflow message at compilation.  Try the same thing with
  404. DYNREC.PAS to see how many records it can handle, remembering that
  405. the records are created dynamically, so you will have to run the
  406. program to actually run out of memory.  The final result will
  407. depend on how much memory you have installed, and how many memory
  408. resident programs you are using.  If you have a full memory of
  409. 640K, I would suggest you start somewhere in the neighborhood of
  410. 8000 records of Friend.
  411.  
  412.                                                         Page 12-7
  413.  
  414.                      Chapter 12 - Pointers and Dynamic Allocation
  415.  
  416.  
  417. Now you should have a good idea of why dynamic allocation can be
  418. used to greatly increase the usefulness of your programs.  There
  419. is, however, one more important topic we must cover on dynamic
  420. allocation.  That is the linked list.
  421.  
  422.  
  423. WHAT IS A LINKED LIST?
  424. _________________________________________________________________
  425.  
  426. Understanding and using a linked list is by far  ================
  427. the most baffling topic you will confront in       LINKLIST.PAS
  428. Pascal.  Many people simply throw up their hands ================
  429. and never try to use a linked list.  I will try
  430. to help you understand it by use of an example
  431. and lots of explanation.  Examine the program named LINKLIST.PAS
  432. for an example of a linked list.  I tried to keep it short so you
  433. could see the entire operation and yet do something meaningful.
  434.  
  435. To begin with, notice that there are two types defined in lines 4
  436. and 6, a pointer to the record and the record itself.  The record,
  437. however, has one thing about it that is new to us, the last entry,
  438. Next, is a pointer to a record of this type.  This record then, has
  439. the ability to point to itself, which would be trivial and
  440. meaningless, or to another record of the same type which will be
  441. extremely useful in this case.  In fact, this is the way a linked
  442. list is used.  I must point out, that the pointer to another
  443. record, in this case called Next, does not have to be last in the
  444. list, it can be anywhere in the list that is convenient for you.
  445.  
  446. A couple of pages ago, we discussed the fact that we had to break
  447. the great rule of Pascal and use an identifier before it was
  448. defined.  This is the reason the exception to the rule was allowed. 
  449. Since the pointer points to the record, and the record contains a
  450. reference to the pointer, one has to be defined after being used,
  451. and by rules of Pascal, the pointer can be defined first, provided
  452. that the record is defined immediately following it.  That is a
  453. mouthful but if you just use the syntax shown in the example, you
  454. will not get into trouble with it.
  455.  
  456.  
  457. STILL NO VARIABLES?
  458. _________________________________________________________________
  459.  
  460. It may seem strange, but we still have no variables defined, except
  461. for our old friend Index.  In fact, for this example, we will only
  462. define 3 pointers.  In the last example we defined 54 pointers, and
  463. had lots of storage room.  Before we are finished, we will have at
  464. least a dozen pointers but they will be stored in our records, so
  465. they too will be dynamically allocated.
  466.  
  467. Let's look at the program itself now.  In line 20, we create a
  468. dynamically allocated record and define it by the pointer named 
  469. Place_In_List.  It is composed of the three data fields, and
  470.  
  471.                                                         Page 12-8
  472.  
  473.                      Chapter 12 - Pointers and Dynamic Allocation
  474.  
  475. another pointer.  We define Start_Of_List to point to the first
  476. record created, and we will leave it unchanged throughout the
  477. program.  The pointer Start_Of_List will always point to the first
  478. record in the linked list which we are building up.  The data space
  479. is as depicted in figure 12-7.
  480.  
  481.  
  482. WHAT IS "nil" AND WHAT IS IT USED FOR?
  483. _________________________________________________________________
  484.  
  485. We define the three variables in the record to be any name we
  486. desire for illustrative purposes, and set the pointer in the record
  487. to nil.  The word nil is another reserved word that doesn't give
  488. the pointer an address but defines it as empty.  A pointer that is
  489. currently nil cannot be used to manipulate data because it has no
  490. value, but it can be tested in a logical statement to see if it is
  491. nil.  It is therefore a dummy assignment.  With all of that, the
  492. first record is completely defined.
  493.  
  494.  
  495. DEFINING THE SECOND RECORD
  496. _________________________________________________________________
  497.  
  498. When you were young you may have played a searching game in which
  499. you were given a clue telling you where to find the next clue.  The
  500. next clue had a clue to the location of the third clue.  You kept
  501. going from clue to clue until you found the prize.  You simply
  502. exercised a linked list.  We will now build up the same kind of a
  503. list in which each record will tell us where the next record can
  504. be found.
  505.  
  506. In lines 27 through 33 we will define the second record.  Our goal
  507. will be to store a pointer to the second record in the pointer
  508. field of the first record.  In order to keep track of the last
  509. record, the one in which we need to update the pointer, we will
  510. keep a pointer to it in Temp_Place.  Now we can dynamically
  511. allocate another new record and use Place_In_List to point to it. 
  512. Since Temp_Place is now pointing at the first record, we can use
  513. it to store the value of the pointer which points to the new record
  514. which we do in line 29.  The 3 data fields of the new record are
  515. assigned nonsense data for our illustration, and the pointer field
  516. of the new record is assigned nil.  We have reached the point when
  517. the data space is as depicted in figure 12-8.
  518.  
  519. Let's review our progress to this point.  We now have the first
  520. record with a person's name and a pointer to the second record, and
  521. a second record containing a different person's name and a pointer
  522. assigned nil.  We also have three pointers, one pointing to the
  523. first record, one pointing to the last record, and one we used just
  524. to get here since it is only a temporary pointer.  If you
  525. understand what is happening so far, let's go on to add some
  526. additional records to the list.  If you are confused, go back over
  527. this material again.
  528.  
  529.  
  530.                                                         Page 12-9
  531.  
  532.                      Chapter 12 - Pointers and Dynamic Allocation
  533.  
  534.  
  535. TEN MORE RECORDS
  536. _________________________________________________________________
  537.  
  538. The next section of code is contained within a for loop so the
  539. statements are simply repeated ten times.  If you observe
  540. carefully, you will notice that the statements are identical to the
  541. second group of statements in the program (except of course for the
  542. name assigned).  They operate in exactly the same manner, and we
  543. end up with ten more names added to the list.  You will now see why
  544. the temporary pointer was necessary, but pointers use little memory
  545. and are therefore relatively cheap, so feel free to use them at
  546. will.  A pointer generally uses only 4 bytes of memory.
  547.  
  548.  
  549. FINALLY, A COMPLETE LINKED LIST
  550. _________________________________________________________________
  551.  
  552. We now have generated a linked list of twelve entries.  We have a
  553. pointer pointing at the first entry, and another pointer pointing
  554. at the last.  The only data stored within the program itself are
  555. three pointers, and one integer, all of the data is on the heap. 
  556. This is one advantage to a linked list, it uses very little local
  557. memory, but it is costly in terms of programming.  (Keep in mind
  558. that all of the data must be stored somewhere in memory, and in the
  559. case of the linked list, it is stored on the heap.)  You should
  560. never use a linked list simply to save memory, but only because a
  561. certain program lends itself well to it.  Some sorting routines are
  562. extremely fast because of using a linked list, and it could be
  563. advantageous to use in a database. 
  564.  
  565.  
  566.  
  567. HOW DO WE GET TO THE DATA NOW?
  568. _________________________________________________________________
  569.  
  570. Since the data is in a list, how can we get a copy of the fourth
  571. entry for example?  The only way is to start at the beginning of
  572. the list and successively examine pointers until you reach the
  573. desired one.  Suppose you are at the fourth and then wish to
  574. examine the third.  You cannot back up, because you didn't define
  575. the list that way, you can only start at the beginning and count
  576. to the third.  You could have defined the record with two pointers,
  577. one pointing forward, and one pointing backward.  This would be a
  578. doubly-linked list and you could then go directly from entry four
  579. to entry three.
  580.  
  581. Now that the list is defined, we will read the data from the list
  582. and display it on the video monitor.  We begin by defining the
  583. pointer, Place_In_List, as the start of the list.  Now you see why
  584. it was important to keep a copy of where the list started.  In the
  585. same manner as filling the list, we go from record to record until
  586. we find the record with the value nil stored in its pointer.
  587.  
  588.  
  589.                                                        Page 12-10
  590.  
  591.                      Chapter 12 - Pointers and Dynamic Allocation
  592.  
  593. There are entire books on how to use linked lists, and most Pascal
  594. programmers will seldom, if ever, use them.  For this reason,
  595. additional detail is considered unnecessary, but to be a fully
  596. informed Pascal programmer, some insight is necessary.
  597.  
  598.  
  599.  
  600. PROGRAMMING EXERCISE
  601. _________________________________________________________________
  602.  
  603. 1.   Write a program to store a few names dynamically, then display
  604.      the stored names on the monitor.  As your first exercise in
  605.      dynamic allocation, keep it very simple.
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.                                                        Page 12-11
  649.